package client.vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeListener;

import modele.Coordonnee;
import modele.Minuteur;
import modele.Puissance;
import modele.Region;
import client.controleur.JeuActionListener;
import client.controleur.JeuChangeListener;
import client.controleur.JeuMouseListener;
import codebase.IJeuInterface;
import codebase.IJoueur;
import codebase.IPartie;
import codebase.IUnite;

public class Jeu extends JPanel implements IJeuInterface {

	private static final long serialVersionUID = 1L;
	private static IPartie partie;
	private int nbJoueurs;
	private static IJoueur joueur;
	private Minuteur minuteur;

	private final static Image img = new ImageIcon("./src/client/images/map.fw.png").getImage();
	private JButton quitter, nextPhase;
	private JLabel nomTour, nomPhase, compteur;

	private static ActionListener actionListener;
	private static ChangeListener changeListener;
	private static JButton boutonStartChat;
	private static JButton boutonSwap;
	private static JPanel panelChat;
	private static JPanel panelListeJoueurs;
	private static JPanel panelChkBox;
	private static JTabbedPane tabbedPane;
	private static ArrayList<Tab> tabs;

	public Jeu(IPartie p, IJoueur j) throws RemoteException {
		partie = p;
		joueur = j;
		tabs = new ArrayList<Tab>();
		actionListener = new JeuActionListener(this, partie, joueur);
		changeListener = new JeuChangeListener(this);
		initFenetre();
		resetNbJoueurs();
		initPanelListeJoueurs();
		initPanelChatRMI();
		initPanelPuissances();
		initInfoPhase();
		setVisible(true);
		this.addMouseListener(new JeuMouseListener(this, partie));

	}

	public void initFenetre() {
		setBackground(Color.CYAN);
		Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
		setPreferredSize(size);
		setMinimumSize(size);
		setMaximumSize(size);
		setSize(size);
		setLayout(null);
		quitter = new JButton(new ImageIcon("./src/client/images/close.png"));
		this.add(quitter);
		quitter.setBounds(1344, 5, 15, 15);
		quitter.addActionListener(actionListener);
		nextPhase = new JButton(new ImageIcon("./src/client/images/next.png"));
		this.add(nextPhase);
		nextPhase.setBounds(1214, 6, 7, 12);
		nextPhase.addActionListener(actionListener);
		setVisible(true);
	}

	public void resetNbJoueurs() throws RemoteException {
		this.nbJoueurs = partie.getConfig().getNbJoueurs();
	}

	public void initInfoPhase() throws RemoteException {
		JPanel initInfoPhase = new JPanel();
		add(initInfoPhase);
		initInfoPhase.setBounds(922, 10, 437, 90);
		initInfoPhase.setOpaque(false);
		initInfoPhase.setLayout(null);
		nomTour = new JLabel("", JLabel.CENTER);
		initInfoPhase.add(nomTour);
		nomTour.setFont(new Font("Arial", Font.BOLD, 15));
		nomTour.setBounds(5, 0, 292, 20);
		nomPhase = new JLabel("", JLabel.CENTER);
		initInfoPhase.add(nomPhase);
		nomPhase.setFont(new Font("Arial", Font.BOLD, 20));
		nomPhase.setBounds(5, 0, 292, 60);
		compteur = new JLabel("");
		initInfoPhase.add(compteur);
		Font font2 = new Font("Arial", Font.BOLD, 30);
		compteur.setFont(font2);
		compteur.setBounds(310, 0, 160, 50);
		minuteur = new Minuteur(compteur, 25);
		refreshInfoPhase();
	}

	public JLabel getNomTour() {
		return nomTour;
	}

	public void refreshInfoPhase() throws RemoteException {
		nomTour.setText(partie.getDernierTour().getInfo());
		minuteur.stopMinuteur();
		switch (partie.getDernierTour().getPhase()) {
		case 1:
			nomPhase.setText("Négociation");
			afficheNegociation(true);
			minuteur = new Minuteur(compteur, partie.getConfig().getDureeNegociations() * 60);
			break;
		case 2:
			nomPhase.setText("Rédaction des ordres");
			afficheNegociation(false);
			minuteur = new Minuteur(compteur, partie.getConfig().getDureeOrdres() * 60);
			break;
		case 3:
			nomPhase.setText("Dispersion");
			minuteur = new Minuteur(compteur, partie.getConfig().getDureeDispersions() * 60);
			break;
		}
		this.validate();
		this.repaint();
	}

	public void initPanelPuissances() throws RemoteException {
		// Panel des puissances
		JPanel haut = new JPanel();
		add(haut);
		haut.setBounds(922, 60, 437, 112);
		haut.setLayout(new BorderLayout());
		// Panel liste puissances
		JPanel panelListePuissance = new JPanel();
		panelListePuissance.setSize(437, 63);
		haut.add(panelListePuissance, BorderLayout.PAGE_START);
		panelListePuissance.setLayout(new GridLayout(1, this.nbJoueurs));
		ArrayList<JButton> listeBoutonsPuissance = new ArrayList<JButton>();
		ArrayList<ArrayList<Puissance>> list = partie.getConfig().getListePuissance();
		for (ArrayList<Puissance> arrayList : list) {
			String nomImg = "icone_soldat_";
			if (arrayList.size() > 1) {
				for (Puissance p : arrayList) {
					nomImg += p.getAbreviation();
				}
				nomImg += ".png";
			} else {
				nomImg = arrayList.get(0).getAdrImage();
			}
			listeBoutonsPuissance.add(new JButton(new ImageIcon("./src/client/images/miniatures/"
					+ nomImg)));
		}
		for (JButton bouton : listeBoutonsPuissance) {
			bouton.setOpaque(false);
			bouton.setFocusable(false);
			bouton.setSelected(false);
			bouton.setRolloverEnabled(false);
			bouton.setBackground(Color.WHITE);
			panelListePuissance.add(bouton);
			// bouton.addActionListener(actionListener);
		}
		// Panel choix puissances
		JPanel panelChoixPuissance = new JPanel();
		haut.add(panelChoixPuissance, BorderLayout.PAGE_END);
		panelChoixPuissance.setLayout(new GridLayout(1, this.nbJoueurs));
		HashMap<String, String> hm = partie.gerePuissanceJoueur(2, null, null);
		for (ArrayList<Puissance> arrayList : list) {
			String nomJoueur = "";
			if (arrayList.size() > 1) {
				for (Puissance p : arrayList) {
					nomJoueur = hm.get(p.getAbreviation());
				}
			}
			JLabel l = new JLabel(nomJoueur, JLabel.CENTER);
			if (nomJoueur.equals(joueur.getNom()))
				l.setForeground(Color.RED);
			panelChoixPuissance.add(l);
		}

		for (ArrayList<Puissance> arrayList : list) {
			String nomJoueur = "";
			if (arrayList.size() > 1) {
				for (Puissance p : arrayList) {
					nomJoueur = hm.get(p.getAbreviation());
				}
			}
			// System.out.println(nomJoueur);
			/*
			 * panelChoixPuissance.add(new JLabel("Score :" +
			 * partie.getJoueurByName(nomJoueur).getScore(), JLabel.CENTER));
			 */
		}

	}

	public void dessinerPointRavitaillement(Graphics g) throws RemoteException {
		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		// Déssiner tous les centres de ravitaillement
		for (IJoueur joueur : partie.getListeJoueur()) {
			for (Puissance puissance : joueur.getListPuissance()) {

				// On dessine les centres de ravitaillement
				for (Region region : puissance.getListeRegionsPossedes()) {
					Coordonnee coo = region.getCoordoRavitaillement();
					if (coo.getX() > 0 && coo.getY() > 0) {
						g2.setColor(puissance.getCouleur());
						g2.fillOval(coo.getX(), coo.getY(), 15, 15);
						g2.setColor(Color.BLACK);
						g2.drawOval(coo.getX(), coo.getY(), 15, 15);
					}
				}

			}
		}

		// Déssiner toute les unités
		for (String keyRegion : partie.getCarte().keySet()) {
			Region region = partie.getCarte().get(keyRegion);
			Coordonnee coo2 = region.getCoordoUnite();
			if (region.getOccupant() != null) {
				IUnite unite = region.getOccupant();
				String puissance = unite.getProprietaire().getAbreviation().toLowerCase();

				if (coo2.getX() > 0 && coo2.getY() > 0) {
					if (unite.getTypeUnite().equals("Flotte")) {

						g2.drawImage(new ImageIcon("./src/client/images/unites/flotte_" + puissance
								+ ".png").getImage(), coo2.getX(), coo2.getY(), 30, 20, null);
					} else if (unite.getTypeUnite().equals("Armee")) {

						g2.drawImage(new ImageIcon("./src/client/images/unites/armee_" + puissance
								+ ".png").getImage(), coo2.getX() - 12, coo2.getY() - 7, 30, 14,
								null);
					}
				}
			} else {
				g2.drawRect(coo2.getX(), coo2.getY(), 15, 15);
			}

		}
	}

	public JButton getBoutonQuitter() {
		return quitter;
	}

	public JButton getBoutonNextPhase() {
		return nextPhase;
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(img, 0, 0, null);
		try {
			dessinerPointRavitaillement(g);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

	public void initPanelListeJoueurs() throws RemoteException {
		panelListeJoueurs = new JPanel();
		panelListeJoueurs.setLayout(new BorderLayout());
		panelListeJoueurs.setBounds(922, 244, 437, 520);
		panelListeJoueurs.setOpaque(false);
		panelListeJoueurs.setVisible(false);
		ArrayList<IJoueur> listeJoueurs = partie.getListeJoueur();
		JLabel label = new JLabel("Liste des joueurs");
		panelListeJoueurs.add(label, BorderLayout.NORTH);
		panelChkBox = new JPanel();
		panelChkBox.setLayout(new BoxLayout(panelChkBox, BoxLayout.Y_AXIS));
		panelChkBox.setOpaque(false);

		for (IJoueur j : listeJoueurs) {
			JCheckBox jcb = new JCheckBox(j.getNom());
			jcb.setOpaque(false);
			if (j.getNom().equals(joueur.getNom())) {
				jcb.setVisible(false);
				jcb.setSelected(true);
			}
			panelChkBox.add(jcb);

		}

		panelListeJoueurs.add(panelChkBox, BorderLayout.CENTER);
		boutonStartChat = new JButton("Conversation");
		boutonStartChat.setPreferredSize(new Dimension(panelListeJoueurs.getWidth(), 39));

		panelListeJoueurs.add(boutonStartChat, BorderLayout.SOUTH);

		add(panelListeJoueurs);

	}

	public void initPanelChatRMI() {
		panelChat = new JPanel();
		panelChat.setLayout(new BorderLayout());
		panelChat.setBounds(922, 244, 437, 520);
		add(panelChat);
		panelChat.setVisible(false);
		tabbedPane = new JTabbedPane();
		panelChat.add(tabbedPane, BorderLayout.CENTER);
		boutonSwap = new JButton("Voir la liste des joueurs");
		panelChat.add(boutonSwap, BorderLayout.SOUTH);

		boutonStartChat.addActionListener(actionListener);
		boutonSwap.addActionListener(actionListener);
		tabbedPane.addChangeListener(changeListener);

	}

	public void afficheNegociation(boolean b) {
		if (b)
			panelListeJoueurs.setVisible(true);
		else {
			panelListeJoueurs.setVisible(false);
			panelChat.setVisible(false);
		}
	}

	public static void afficherChat(boolean b) {
		if (b) {
			panelChat.setVisible(true);
			panelListeJoueurs.setVisible(false);

		} else {
			panelChat.setVisible(false);
			panelListeJoueurs.setVisible(true);
		}
	}

	public JButton getBoutonStartChat() {
		return boutonStartChat;
	}

	public JButton getBoutonSwap() {
		return boutonSwap;
	}

	public JPanel getPanelListeChkBox() {
		return panelChkBox;
	}

	public JTabbedPane getTabbedPane() {
		return tabbedPane;
	}

	public static IPartie getPartie() {
		return partie;
	}

	public static IJoueur getJoueur() {
		return joueur;
	}

	public static void addNewTab(ArrayList<String> listeJoueursChat, boolean b)
			throws RemoteException {
		String tabName = "";
		Boolean first = true;
		for (String j : listeJoueursChat) {
			if (first) {
				first = false;
			} else
				tabName += ", ";
			tabName += j;

		}
		if (!tabExists(tabName) && listeJoueursChat.size() > 1) {
			Tab tab = new Tab(tabName, tabbedPane, listeJoueursChat, tabbedPane.getComponentCount());
			tabs.add(tab);
			tabbedPane.addTab(tabName, new ImageIcon("src/client/images/icone_chat.png"), tab, "");

			if (b) {
				afficherChat(true);
				tabbedPane.setSelectedComponent(tab);
			}
		}

	}

	public static boolean tabExists(String tabName) {
		for (Tab t : tabs) {
			if (t.getTabName().equals(tabName)) {
				return true;
			}
		}
		return false;
	}

	public static void refresh(String msg, String tabName, ArrayList<String> listeJoueursChat)
			throws RemoteException {

		if (!tabExists(tabName)) {
			addNewTab(listeJoueursChat, false);
		}

		if (panelListeJoueurs.isVisible()) {
			boutonStartChat.setIcon(new ImageIcon("src/client/images/icone_chat.png"));
		}

		for (Tab t : tabs) {
			if (t.getTabName().equals(tabName)) {
				if (t.getIndex() != tabbedPane.getSelectedIndex()) {
					tabbedPane.setIconAt(t.getIndex(), new ImageIcon(
							"src/client/images/icone_chat.png"));
				}
				t.refresh(msg);
			}
		}
	}

	public static void refreshListeJoueurs() throws RemoteException {

		ArrayList<IJoueur> listeJoueurs = partie.getListeJoueur();
		panelChkBox.removeAll();

		for (IJoueur j : listeJoueurs) {
			JCheckBox jcb = new JCheckBox(j.getNom());
			if (j.getNom().equals(joueur.getNom())) {
				jcb.setVisible(false);
				jcb.setSelected(true);
			}
			jcb.setOpaque(false);
			panelChkBox.add(jcb);
		}

	}

	public static ArrayList<Tab> getTabs() {
		return tabs;
	}

	@Override
	public void receptionNotification() {
		try {
			System.out.println(joueur.getNom() + " a ete notifie");
			refreshInfoPhase();
		} catch (RemoteException e) {
			e.printStackTrace();
		}

	}
}
